#ifndef SERVER_H
#define SERVER_H

#include <QObject>
#include <QTcpServer>
#include <QTcpSocket>
#include <QMap>
#include <QScreen>
#include <QGuiApplication>
#include <QImage>
#include <QBuffer>
#include <QTimer>
#include <QFile>
#include <QDir>
#include <QSet>

#include "../network/networkmanager.h"
#include "../network/lanservice.h"
#include "../logging/logger.h"
#include "screencapture.h"
#include "inputsimulator.h"
#include "audiocapture.h"

// 客户端连接信息
struct ClientInfo {
    QTcpSocket *socket;
    QString username;
    QHostAddress clientAddress;
    quint16 clientPort;
    QDateTime connectTime;
    bool receivingScreenUpdates;    // 是否正在接收屏幕更新
    QTimer *screenUpdateTimer;      // 屏幕更新定时器
    int updateInterval;             // 更新间隔 (ms)
    bool receivingAudioStream;      // 是否正在接收音频流
    QByteArray receiveBuffer;       // 接收数据缓冲区
};

// 文件接收上下文
struct FileReceiveContext {
    QFile* file;                   // 接收的文件对象
    QString fileName;              // 文件名
    QString filePath;              // 完整文件路径
    qint64 fileSize;               // 文件总大小
    qint64 receivedSize;           // 已接收大小
    QDateTime startTime;           // 开始接收时间
    QString transferId;            // 文件传输ID
    int lastBlockNumber;           // 上一个处理的块编号
    QSet<int> receivedBlocks;      // 已接收的数据块集合
    
    // 构造函数
    FileReceiveContext() : file(nullptr), fileSize(0), receivedSize(0), lastBlockNumber(-1) {}
    
    // 析构函数
    ~FileReceiveContext() {
        if (file) {
            if (file->isOpen()) {
                file->close();
            }
            delete file;
        }
    }
};

class Server : public QObject
{
    Q_OBJECT

public:
    explicit Server(QObject *parent = nullptr);
    ~Server();
    
    // 启动服务器
    bool start(quint16 port);
    
    // 停止服务器
    void stop();
    
    // 获取连接的客户端列表
    QStringList getConnectedClients() const;
    
    // 断开指定客户端
    bool disconnectClient(const QString &clientId);
    
    // 是否正在运行
    bool isRunning() const;
    
    // 设置屏幕捕获帧率
    void setCaptureFrameRate(int fps);
    
    // 设置压缩质量
    void setCompressionQuality(int quality);
    
    // 设置是否启用差分编码
    void setDiffEncodingEnabled(bool enabled);
    
    // 设置是否允许远程控制
    void setRemoteControlEnabled(bool enabled);
    
    // 设置服务器名称
    void setServerName(const QString &name);
    
    // 获取服务器名称
    QString getServerName() const;
    
    // 设置是否启用局域网发现服务
    void enableLANDiscovery(bool enable);
    
    // 检查局域网发现服务是否启用
    bool isLANDiscoveryEnabled() const;
    
    // 设置音频质量
    void setAudioQuality(int quality);
    
    // 获取音频质量
    int getAudioQuality() const;
    
    // 设置是否启用音频传输
    void setAudioEnabled(bool enabled);
    
    // 检查音频传输是否启用
    bool isAudioEnabled() const;

signals:
    // 客户端连接信号
    void clientConnected(const QString &clientId, const QString &clientAddress);
    
    // 客户端断开信号
    void clientDisconnected(const QString &clientId);
    
    // 收到鼠标事件信号
    void mouseEventReceived(const QString &clientId, int x, int y, int button, bool pressed);
    
    // 收到键盘事件信号
    void keyboardEventReceived(const QString &clientId, int key, bool pressed);
    
    // 服务器状态变化信号
    void serverStatusChanged(bool running);
    
    // 错误信号
    void errorOccurred(const QString &errorMsg);

private slots:
    // 处理新客户端连接
    void onNewConnection();
    
    // 处理客户端断开连接
    void onClientDisconnected();
    
    // 处理客户端数据
    void onReadyRead();
    
    // 处理屏幕更新
    void onScreenUpdated(const QByteArray &imageData, const QSize &size);
    
    // 处理区域更新
    void onRegionUpdated(const QVector<ScreenRegion> &regions, const QSize &size);
    
    // 向特定客户端发送屏幕更新
    void sendScreenUpdateToClient(QTcpSocket *socket);
    
    // 处理鼠标事件
    void handleMouseEvent(const QString &clientId, int x, int y, int button, bool pressed);
    
    // 处理键盘事件
    void handleKeyboardEvent(const QString &clientId, int key, bool pressed);
    
    // 处理音频数据
    void onAudioDataAvailable(const QByteArray &data);
    
    // 处理音频捕获错误
    void onAudioCaptureError(const QString &errorMsg);

private:
    QTcpServer *tcpServer;
    ScreenCapture *screenCapture;
    InputSimulator *inputSimulator;
    LANService *lanService;
    AudioCapture *audioCapture;
    
    QMap<QTcpSocket*, ClientInfo> clients;
    QMap<QString, QTcpSocket*> clientsById;
    
    bool running;
    quint16 serverPort;
    bool remoteControlEnabled;
    bool lanDiscoveryEnabled;
    bool audioEnabled;
    int audioQuality;
    QString serverName;
    
    // 文件传输相关
    QMap<QTcpSocket*, FileReceiveContext> fileReceiveMap;
    QString fileReceiveDir;         // 文件接收目录
    
    // 生成客户端唯一ID
    QString generateClientId(QTcpSocket *socket);
    
    // 处理客户端消息
    void processClientMessage(QTcpSocket *socket, const QByteArray &data);
    
    // 发送屏幕数据到客户端
    void sendScreenData(QTcpSocket *socket, bool fullScreen = true);
    
    // 发送消息到客户端
    bool sendMessage(QTcpSocket *socket, MessageType type, const QJsonObject &data);
    
    // 自动授权客户端
    void authorizeClient(QTcpSocket *socket, const QString &username);
    
    // 启动客户端屏幕更新
    void startClientScreenUpdates(QTcpSocket *socket, int fps = 10);
    
    // 停止客户端屏幕更新
    void stopClientScreenUpdates(QTcpSocket *socket);
    
    // 启动局域网发现服务
    void startLANDiscovery();
    
    // 停止局域网发现服务
    void stopLANDiscovery();
    
    // 开始向特定客户端发送音频
    void startClientAudioStream(QTcpSocket *socket);
    
    // 停止向特定客户端发送音频
    void stopClientAudioStream(QTcpSocket *socket);
    
    // 向所有接收音频的客户端发送音频数据
    void sendAudioDataToClients(const QByteArray &data);
    
    // 处理文件传输请求
    void handleFileSendRequest(QTcpSocket *socket, const QJsonObject &data);
    
    // 处理文件数据块
    void handleFileSendData(QTcpSocket *socket, const QJsonObject &data);
    
    // 处理文件传输完成
    void handleFileSendFinish(QTcpSocket *socket, const QJsonObject &data);
};

#endif // SERVER_H